#include <iostream>
using std::cout;
using std::endl;
using std::cin;

#include "IndexedBST.h"
void test();
void solution();
void test2();

int main()
{
    //cout << "hello world" << endl;
    //test2();

    solution();

    return 0;
}

// 求一个vector中所有元素的异或和
int xor_sum(vector<int>& v)
{
    if (v.size() == 0)
    {
        return 0;
    }
    else 
    {
        int sum = 0;
        int sz = v.size();
        for (int i = 0; i < sz; ++i)
        {
            sum = sum ^ v[i];
        }

        return sum;
    }
}

void solution()
{
    /*
        输入第一行一个数字 m (m<=1000000)，表示有 m 个操作。
        接下来 m 行，每一行有两个数字 a，b：
    */
   int m = 0;
   cin >> m;
   
   int opcode = 0;
   int operand = 0;
   IndexedBST<int, int> t;
   for (int i = 0; i < m; ++i)
   {
        cin >> opcode >> operand;

        /*
            对于输入中的每一种操作，输出->执行操作的过程中依次比较的元素值的异或值。
        */

        switch (opcode)
        {
            // opcode = 0 表示插入操作
            case 0:
            {
                int sum = 0;
                int rc1 = t.e_sequence_key(operand, sum);
                
                if (rc1) 
                {
                    // 插入元素已存在，输出 0, 不插入
                    cout << 0 << endl;
                }
                else 
                {
                    bool rc = t.insert({operand, operand});
                    cout << sum << endl;
                }
                break;
            }
            // opcode = 1 表示find_by_key操作
            case 1:
            {
                int sum = 0;
                bool rc = t.e_sequence_key(operand, sum);
                if (!rc)
                {
                    // 查找如果未找到, 输出0
                    cout << 0 << endl;
                }
                else 
                {
                    cout << sum << endl;
                }
                break;
            }
            // opcode = 2 表示erase_by_key操作
            case 2:
            {
                int sum = 0;
                bool rc1 = t.e_sequence_key(operand, sum);
                
                if (!rc1)
                {
                    // 删除元素不存在，输出 0
                    cout << 0 << endl;
                }
                else
                {
                    bool rc = t.erase_by_key(operand); // 这一行代码所在的位置会影响时间超限, 这个是测试点的问题
                    cout << sum << endl;
                }
                break;
            }
            // opcode = 3 表示find_by_index操作
            case 3:
            {
                int sum = 0;
                bool rc = t.e_sequence_index(operand, sum);
                if (!rc)
                {
                    // 查找如果未找到, 输出0
                    cout << 0 << endl;
                }
                else 
                {
                    cout << sum << endl;
                }
                break;
            }
            // opcode = 4 表示erase_by_index操作
            case 4:
            {
                int sum = 0;
                int rc1 = t.e_sequence_index(operand, sum);
                
                if (!rc1)
                {
                    // 如果没有要删除的元素, 输出0
                    cout << 0 << endl;
                }
                else 
                {
                    bool rc = t.erase_by_index(operand);
                    cout << sum << endl;
                    
                }
                break;
            }
            default:
            {
                ;
            }
        }
   }

}

void test2()
{
    IndexedBST<int, int> t;
    t.insert({6, 6});
    t.insert({5, 5});
    t.insert({1, 1});
    t.insert({7, 7});
    
    t.erase_by_index(3);
}

void test()
{
    // 测试插入, 决定插入节点位置是节点的key, 而节点的val对插入的位置没有影响
    IndexedBST<int, int> t1;
    t1.insert({5, 5});
    t1.insert({2, 2});
    t1.insert({7, 7});

    t1.insert({3, 3});
    t1.insert({1, 1});

    t1.insert({6, 6});
    t1.insert({8, 8});

    // 测试删除 by key
    // t1.erase_by_key(7);
    // t1.erase_by_key(1);
    // t1.erase_by_key(2);

    // 测试删除 by index
    t1.erase_by_index(1);
    t1.erase_by_index(0);
    t1.erase_by_index(6);

    // 测试find_by_key
    // Node<int, int>* rc = t1.find_by_key(2);
    // cout << rc->m_key << endl;

    // rc = t1.find_by_key(8);
    // cout << rc->m_key << endl;

    // rc = t1.find_by_key(5);
    // cout << rc->m_key << endl;

    // rc = t1.find_by_key(4);

    // // 测试find_by_index
    // rc = t1.find_by_index(1);
    // cout << rc->m_key << endl;

    // rc = t1.find_by_index(5);
    // cout << rc->m_key << endl;

    // rc = t1.find_by_index(0);
    //cout << rc->m_key << endl;
}
